package cn.lili.modules.member.service;


import cn.lili.common.security.enums.SceneEnums;
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.member.entity.dos.User;
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.vo.UserVO;
import cn.lili.modules.permission.entity.dto.UserAdminDTO;
import cn.lili.modules.permission.entity.vo.AdminUserVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import java.util.List;
import java.util.Map;

/**
 * 用户业务层
 *
 * @author Bulbasaur
 * @since 2020-02-25 14:10:16
 */
public interface ManagerUserService extends IService<User> {

    String DEFAULT_PASSWORD = new BCryptPasswordEncoder().encode(StringUtils.md5("123456"));

    /**
     * 获取当前登录的用户信息
     *
     * @return 用户信息
     */
    UserVO userInfo();

    /**
     * 通过用户名获取用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username, SceneEnums scene);

    /**
     * 用户登录
     *
     * @param userLoginDTO 用户登录查询
     * @return token
     */
    User userLoginQuery(UserLoginDTO userLoginDTO);

    /**
     * 手机号注册登录
     *
     * @param mobilePhone 手机号
     * @param scene       场景
     * @return user
     */
    User mobilePhoneLogin(String mobilePhone, SceneEnums scene);

    /**
     * 修改用户信息
     *
     * @param userInfoDTO 用户修改信息
     * @return 修改后的用户
     */
    User editOwn(UserInfoDTO userInfoDTO);

    /**
     * 后台-添加用户
     *
     * @param userInfoDTO 用户
     * @return 用户
     */
    User addUser(UserInfoDTO userInfoDTO);

    /**
     * 后台-修改用户
     *
     * @param userInfoDTO 后台修改用户参数
     * @return 用户
     */
    AdminUserVO updateUser(UserEditDTO userEditDTO);

    /**
     * 获取用户分页
     *
     * @param userSearchParams 用户搜索VO
     * @param page             分页
     * @return 用户分页
     */
    Page<AdminUserVO> getUserPage(UserSearchParams userSearchParams, PageVO page);

    /**
     * 获取用户列表
     *
     * @param searchParams 查询参数
     * @return 用户列表
     */
    List<User> list(UserSearchParams searchParams);


    /**
     * 修改用户状态
     *
     * @param userStatusChangeDTO 用户状态修改DTO
     * @return 修改结果
     */
    Boolean updateUserStatus(UserStatusChangeDTO userStatusChangeDTO);

    /**
     * 删除用户
     *
     * @param userStatusChangeDTO 用户状态修改DTO
     * @return 修改结果
     */
    Boolean removeUser(UserStatusChangeDTO userStatusChangeDTO);

    /**
     * 根据条件查询用户总数
     *
     * @param userSearchParams 用户搜索VO
     * @return 用户总数
     */
    long getMemberNum(UserSearchParams userSearchParams);

    /**
     * 获取指定用户数据
     *
     * @param columns 指定获取的列
     * @param userIds 用户ids
     * @return 指定用户数据
     */
    List<Map<String, Object>> listFieldsByMemberIds(String columns, List<String> userIds);


    /**
     * 获取所有用户的手机号
     *
     * @return 所有用户的手机号
     */
    List<String> getMemberMobile(PageVO pageVO);

    /**
     * 更新用户登录时间为最新时间
     *
     * @param userId 用户id
     * @return 是否更新成功
     */
    Boolean updateUserLoginTime(String userId);

    /**
     * 新增用户
     *
     * @param adminUser
     */
    void saveUser(UserAdminDTO adminUser);

    /**
     * 注册用户
     *
     * @param userInfoDTO
     * @return
     */
    User registerHandler(UserInfoDTO userInfoDTO);


    /**
     * 校验手机号是否存在
     *
     * @param mobile     手机号
     * @param sceneEnums 场景
     * @return 用户
     */
    User checkMobile(String mobile, SceneEnums sceneEnums);

    /**
     * 重置密码
     *
     * @param ids 用户id
     * @return 是否重置成功
     */
    void resetPassword(List<String> ids);
}